/**
 * 运算符
 */

// 1. 算数运算符 + - * / %

// 2. 一元运算符 +a -a
var a = 123;
b = +a;
c = -a;
console.log('一元运算符: ', b, c); // 123 -123

var d = true;
e = +d;
console.log('一元运算符: ',e); // 1

// 3. 自增和自减 ++ --
// 无论++a还是a++都是使原变量立即加1，不同的是a++和++a的值不同
// a++为原值，++a为原值+1后的值
// a++和++a的区别是a++是使用的a后，再对a进行加1; ++a是先把a加1，然后再使用a; --a与a--原理类似
var f = 100;
f++;
console.log('自增和自减++: ', f); // 101
f--;
console.log('自增和自减--: ', f); // 100
++f; // 等同于f = f + 1 -> 101
console.log('++自增和自减: ', f); // 101
--f; // 等同于f = f - 1 -> 100
console.log('--自增和自减: ', f); // 100

// 4. 三目运算符(条件运算符)
var g = 1 ? 2 : 3; // 如果1成立则返回2，不成立则返回3
console.log('三目运算符: ', g); // 三目运算符:  2

// 5. 逻辑运算符 ! && ||
// ---> ! 非: 对一个布尔值取反面
// 对非布尔值进行取反，先将值转换为布尔类型再取反
var h = false;
console.log('逻辑运算符', !h); // true
var j = 123;
console.log('逻辑运算符', !j); // false

// ---> && 与: 对符号两侧的值进行与运算并返回结果
// 只要有一个为false，结果就为false
// 第一个值为flase， 则不会检查第二个值，直接将结果返回
var k = true && false;
console.log('逻辑运算符', k); // false

// ---> || 或: 对符号两侧的值进行或运算并返回结果
// 只要有一个为true，结果就为true
// 第一个值为true， 则不会检查第二个值，直接将结果返回
var l = true || false;
console.log('逻辑运算符', l); // true

// 6. 赋值运算符 = += -=
// +=以及-=, 原值已经发生改变
var m = 123;
console.log('赋值运算符', m += 456); // 579
console.log('赋值运算符', m -= 789); // -210

// 7. 关系运算符 > < >= <=

// 8. 相等运算符 == === != !==
// ---> == 相等，如果值的类型的不同，会将其转换为相同类型的数据再进行比较
console.log('相等运算符', '1' == 1); // true

// ps: undefined衍生自null，所以两个值判断时返回true
console.log('相等运算符', undefined == null); // true

// ps: NaN不和任何值相等，包括它本身
//     可以通过isNaN()函数判断一个值是否为NaN，如果该值为NaN则返回true否则为false
console.log('相等运算符', NaN == NaN); // false

// ---> === 全等，对符号两侧的值先进行类型判断再进行值判断，不会因为值类型不同进行转换
console.log('相等运算符', '1' === 1); // false

// ---> != 不等
console.log('相等运算符', '1' != 1); // false

// ---> !== 不全等
console.log('相等运算符', '1' !== 1); // true

// 9. 运算符的优先级
// ---> , 使用,可以分割多个语句，一般在声明中使用
var n = 1, p = 2, q = 3;
console.log('运算符的优先级', n, p, q); // 1 2 3

// ---> 先乘除 后加减
var result = 1 || 2 && 3
console.log('运算符的优先级', result); // 1

// 在js中有一个运算符优先级的表
// 可以使用()改变优先级
